/**
 * 广告助手工具类
 * 用于管理微信小程序激励视频广告功能
 */

// 引入Vuex Store
import store from '@/store';

class AdHelper {
  constructor() {
    // 广告实例
    this.adInstance = null;
    // 广告ID
    this.adUnitId = '';
    // 平台信息
    this.platform = {
      isMpWeixin: false
    };
    // 回调函数
    this.pendingCallbacks = {
      success: null,
      fail: null
    };
    // 初始化状态
    this.isInitialized = false;
    // 是否正在加载配置
    this.isLoadingConfig = false;
    
    // 检测平台
    this.checkPlatform();
  }

  /**
   * 检测当前平台
   */
  checkPlatform() {
    // #ifdef MP-WEIXIN
    this.platform.isMpWeixin = true;
    // #endif
  }

  /**
   * 初始化广告
   * @param {String} adUnitId 广告单元ID
   * @returns {Boolean} 初始化结果
   */
  init(adUnitId) {
    // 非微信小程序环境不初始化
    if (!this.platform.isMpWeixin) return false;
    
    // 保存广告ID
    this.adUnitId = adUnitId;
    
    try {
      // 清理旧的实例
      if (this.adInstance) {
        try {
          this.adInstance.offClose();
          this.adInstance.offError();
        } catch (e) {
          console.error('清理旧广告实例失败:', e);
        }
      }
      
      // 检查广告ID是否有效
      if (!this.adUnitId) {
        console.error('无效的广告ID，无法初始化广告实例');
        return false;
      }
      
      // #ifdef MP-WEIXIN
      // 创建广告实例
      this.adInstance = wx.createRewardedVideoAd({
        adUnitId: this.adUnitId
      });
      
      // 绑定关闭事件
      this.adInstance.onClose(res => {
        if (res && res.isEnded) {
          console.log('广告观看完成');
          if (typeof this.pendingCallbacks.success === 'function') {
            this.pendingCallbacks.success();
          }
        } else {
          console.log('广告观看中断');
          if (typeof this.pendingCallbacks.fail === 'function') {
            this.pendingCallbacks.fail('用户未完整观看广告');
          }
        }
        // 重置回调
        this.pendingCallbacks.success = null;
        this.pendingCallbacks.fail = null;
      });
      
      // 绑定错误事件
      this.adInstance.onError(err => {
        console.error('广告加载错误:', err);
        if (typeof this.pendingCallbacks.fail === 'function') {
          this.pendingCallbacks.fail(err);
        }
        // 重置回调
        this.pendingCallbacks.success = null;
        this.pendingCallbacks.fail = null;
      });
      // #endif
      
      this.isInitialized = true;
      return true;
    } catch (err) {
      console.error('广告初始化失败:', err);
      this.isInitialized = false;
      return false;
    }
  }
  
  /**
   * 从Store获取激励视频广告ID
   * @returns {String} 广告ID
   */
  getAdUnitId() {
    return store.getters['config/wxRewardVideoId'];
  }
  
  /**
   * 获取配置是否已加载
   * @returns {Boolean} 配置加载状态
   */
  isConfigLoaded() {
    return store.state.config.configLoaded;
  }
  
  /**
   * 重新加载配置
   * @returns {Promise} 加载结果
   */
  async reloadConfig() {
    if (this.isLoadingConfig) return Promise.resolve(false);
    
    this.isLoadingConfig = true;
    console.log('重新加载系统配置...');
    
    try {
      await store.dispatch('config/fetchSystemConfig');
      const adUnitId = this.getAdUnitId();
      console.log('重新加载系统配置成功，广告ID:', adUnitId);
      this.isLoadingConfig = false;
      return true;
    } catch (error) {
      console.error('重新加载系统配置失败:', error);
      this.isLoadingConfig = false;
      return false;
    }
  }
  
  /**
   * 检查配置并初始化广告
   * @returns {Promise<Boolean>} 初始化结果
   */
  async initAdIfNeeded() {
    // 非微信小程序环境不需要初始化
    if (!this.platform.isMpWeixin) return false;
    
    let adUnitId = this.getAdUnitId();
    
    // 没有广告ID且配置未加载完成，尝试重新加载配置
    if (!adUnitId && !this.isConfigLoaded()) {
      const success = await this.reloadConfig();
      if (!success) return false;
      adUnitId = this.getAdUnitId();
    }
    
    // 如果已有广告ID且广告未初始化，执行初始化
    if (adUnitId && !this.isInitialized) {
      return this.init(adUnitId);
    }
    
    return this.isInitialized;
  }
  
  /**
   * 显示激励视频广告
   * @param {Function} successCallback 成功回调
   * @param {Function} failCallback 失败回调
   * @returns {Promise} 广告展示结果
   */
  async showAd(successCallback, failCallback) {
    // 非微信小程序环境直接返回成功
    if (!this.platform.isMpWeixin) {
      if (typeof successCallback === 'function') {
        successCallback();
      }
      return Promise.resolve();
    }
    
    // 保存回调函数
    this.pendingCallbacks.success = successCallback;
    this.pendingCallbacks.fail = failCallback;
    
    // 尝试初始化广告
    const initialized = await this.initAdIfNeeded();
    if (!initialized) {
      if (typeof failCallback === 'function') {
        failCallback('广告初始化失败');
      }
      return Promise.reject('广告初始化失败');
    }
    
    // 确保广告实例存在
    if (!this.adInstance) {
      if (typeof failCallback === 'function') {
        failCallback('广告实例创建失败');
      }
      return Promise.reject('广告实例创建失败');
    }
    
    // 加载并显示广告
    return this.adInstance.load()
      .then(() => this.adInstance.show())
      .catch(err => {
        console.error('广告显示失败:', err);
        if (typeof failCallback === 'function') {
          failCallback(err);
        }
        // 重置回调
        this.pendingCallbacks.success = null;
        this.pendingCallbacks.fail = null;
        return Promise.reject(err);
      });
  }
  
  /**
   * 显示广告确认弹窗
   * @param {String} title 弹窗标题
   * @param {String} content 弹窗内容
   * @param {Function} successCallback 成功回调
   * @param {Function} failCallback 失败回调
   */
  showAdConfirm(title, content, successCallback, failCallback) {
    // 创建默认的弹窗标题和内容
    const defaultTitle = '解锁提示';
    const defaultContent = '观看完整视频广告即可解锁';
    
    // 显示确认弹窗
    uni.showModal({
      title: title || defaultTitle,
      content: content || defaultContent,
      showCancel: false,
      success: res => {
        if (res.confirm) {
          this.showAd(successCallback, failCallback);
        } else {
          // 用户取消，调用失败回调
          if (typeof failCallback === 'function') {
            failCallback('用户取消观看广告');
          }
        }
      }
    });
  }
}

// 创建单例
const adHelper = new AdHelper();

export default adHelper; 